package com.itany.stream;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;

/**
 * @Author:石小俊
 * @Date:2022/11/17 13:36
 * @Version:1.0-SNAPSHOT
 * @Description:
 */
public class Test01 {

    public static void main(String[] args) {
        // 方式一:Collection体系集合
        List<Integer> list = Arrays.asList(1,3,4,6,7,9,11,13);
        Stream<Integer> stream = list.stream();
        System.out.println(stream);
        // foreach是一个终止操作,表示遍历Stream中的元素
        // 参数是一个Consumer
        stream.forEach(System.out::println);
        System.out.println("-----------------------------");

        // 方式二:Map体系集合
        // 想要获取Map对应的Stream,必须先将Map转换成Set集合
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"admin");
        map.put(2,"alice");
        map.put(3,"jack");
        // 可以将Map的key存放到一个Stream中
        Stream<Integer> keyStream = map.keySet().stream();
        keyStream.forEach(System.out::println);
        // 也可以将Map的key=value整体存放到Stream中
        Stream<Map.Entry<Integer,String>> mapStream = map.entrySet().stream();
        mapStream.forEach(System.out::println);

        System.out.println("-----------------------------");

        // 方式三:数组
        String[] arr = {"南京","苏州","常州","泰州","无锡","徐州"};
        Stream<String> s1 = Arrays.stream(arr);
        s1.forEach(System.out::println);
        System.out.println("-----------------------------");
        Stream<String> s2 = Stream.of(arr);
        s2.forEach(System.out::println);

        System.out.println("-----------------------------");
        // 方式四:可变长类型
        Stream<String> s3 = Stream.of("研发部","市场部","财务部","安保部");
        s3.forEach(System.out::println);

        System.out.println("-----------------------------");

        // 方式五:无限流,将会无限添加元素到Stream中,永不停止
        UnaryOperator operator = UnaryOperator.identity();
        // 参数一:无限流的起始值
        // 参数二:单目运算符/一元运算符
            // UnaryOperator也是一个函数式接口,默认实现的方法表示传递进来的值即为返回值
            // 由于该参数也是一个函数式接口,因此,可以使用Lambda表达式,用于确定下一个元素的值
        // 使用默认方式会无限打印起始值
        // Stream<Integer> s4 = Stream.iterate(1,operator);
        // 可以自定义下一个值的变化
        Stream<Integer> s4 = Stream.iterate(1, i -> i + 1);
        s4.forEach(System.out::println);
    }

}
